#pragma once
#include "Connection.hpp"
#include "mytcp.hpp"
#include "Addr.hpp"
#include"Channel.hpp"
#include"Reactor.hpp"
#include <memory>
int defaultport = 8080;

// 我们可以将listener看成一个特殊的Connection,所以我们在这里使用继承的思想
class Listener : public Connection
{
public:
    Listener(int port = defaultport)
        : _port(port), _listensockfd(std::make_unique<TcpSocket>())
    {
        _listensockfd->BuildListenMethod(_port);
        int fd = _listensockfd->Fd();
        // 设置listen套接字的fd和关心事件
        SetFd(fd);
        // 把listener设置为非阻塞模式
        SetEvents(EPOLLIN | EPOLLET);
        SetNonBlock(fd);
    }
    void Recver()
    {
        // accept
        // LOG(LogLevel::DEBUG)<<"进入Listener的Recver调试模块";
        while (true)
        {
            Addr client(_port);
            int fd = _listensockfd->Accept(&client);
            if (fd < 0)
            {
                // LOG(LogLevel::FATAL)<<"Listener accept error...";
                // exit(accepterr);
                if(fd==ACCEPT_DONE)
                {
                    break;//没有新的连接了,退出循环
                }
                else if(fd==ACCEPT_CONTINUE)
                {
                    continue;//继续读取
                }
                else
                {
                    break;//发生错误
                }
            }
            else
            {
                //获取了一个合法的fd,此时我们就需要构建一个新的类来管理普通的fd
                std::shared_ptr<Connection> channel=std::make_shared<Channel>(fd,client);
                //为该fd注册特定的回调函数
                channel->RegisterHandler(_handler);
                GetOwner()->AddConnection(channel);
            }
        }
    }
    void Sender()
    {
    }
    void Excepter()
    {
    }
    ~Listener()
    {
    }

private:
    int _port;
    std::unique_ptr<Socket> _listensockfd;
};